return {
	"Civitasv/cmake-tools.nvim",
	dependencies = {
		"nvim-lua/plenary.nvim",
        "stevearc/overseer.nvim",
	},
	config = function()
		local osys = require("cmake-tools.osys")

		require("cmake-tools").setup({
			cmake_command = "/usr/bin/cmake",
			ctest_command = "/usr/bin/ctest",
			cmake_use_preset = true,
			cmake_regenerate_on_save = true, -- auto generate when save CMakeLists.txt
			cmake_generate_options = { "-DCMAKE_EXPORT_COMPILE_COMMANDS=1" }, -- this will be passed when invoke `CMakeGenerate`
			cmake_build_options = {}, -- this will be passed when invoke `CMakeBuild`, look github page for details

			cmake_build_directory = function()
				if osys.iswin32 then
					return "out\\${variant:buildType}"
				end
				return "out/${variant:buildType}"
			end, -- this is used to specify generate directory for cmake, allows macro expansion, can be a string or a function returning the string, relative to cwd.
			cmake_compile_commands_options = {
				action = "lsp", -- available options: soft_link, copy, lsp, none
				-- soft_link: this will automatically make a soft link from compile commands file to target
				-- copy:      this will automatically copy compile commands file to target
				-- lsp:       this will automatically set compile commands file location using lsp
				-- none:      this will make this option ignored
				target = vim.loop.cwd(), -- path to directory, this is used only if action == "soft_link" or action == "copy"
			},
			cmake_kits_path = nil, -- this is used to specify global cmake kits path, see CMakeKits for detailed usage
			cmake_variants_message = {
				short = { show = true }, -- whether to show short message
				long = { show = true, max_length = 40 }, -- whether to show long message
			},
			cmake_dap_configuration = { -- debug settings for cmake
				name = "cpp",
				type = "cppdbg",
				request = "launch",
				stopOnEntry = false,
				runInTerminal = true,
				console = "integratedTerminal",
			},
			cmake_executor = { -- executor to use
				name = "overseer", -- name of the executor
				opts = {}, -- the options the executor will get, possible values depend on the executor type. See `default_opts` for possible values.
				default_opts = { -- a list of default and possible values for executors
					toggleterm = {
						direction = "float", -- 'vertical' | 'horizontal' | 'tab' | 'float'
						close_on_exit = false, -- whether close the terminal when exit
						auto_scroll = true, -- whether auto scroll to the bottom
						singleton = true, -- single instance, autocloses the opened one, if present
					},
					overseer = {
						new_task_opts = {
							strategy = {
								"toggleterm",
								direction = "float",
								auto_scroll = true,
								quit_on_exit = "success",
							},
						}, -- options to pass into the `overseer.new_task` command
						on_new_task = function(task)
							require("overseer").open({ enter = false, direction = "right" })
						end, -- a function that gets overseer.Task when it is created, before calling `task:start`
					},
				},
			},
			cmake_runner = { -- runner to use
				name = "toggleterm", -- name of the runner
				opts = {}, -- the options the runner will get, possible values depend on the runner type. See `default_opts` for possible values.
				default_opts = { -- a list of default and possible values for runners
					toggleterm = {
						direction = "float", -- 'vertical' | 'horizontal' | 'tab' | 'float'
						close_on_exit = false, -- whether close the terminal when exit
						auto_scroll = true, -- whether auto scroll to the bottom
						singleton = true, -- single instance, autocloses the opened one, if present
					},
					overseer = {
						new_task_opts = {
							strategy = {
								"toggleterm",
								direction = "horizontal",
								autos_croll = true,
								quit_on_exit = "never",
							},
						}, -- options to pass into the `overseer.new_task` command
						on_new_task = function(task) end, -- a function that gets overseer.Task when it is created, before calling `task:start`
					},
				},
			},
			cmake_notifications = {
				runner = { enabled = true },
				executor = { enabled = true },
				spinner = { "⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏" }, -- icons used for progress display
				refresh_rate_ms = 100, -- how often to iterate icons
			},
			cmake_virtual_text_support = true, -- Show the target related to current file using virtual text (at right corner)
			cmake_use_scratch_buffer = false,
		})
	end,
}
